package com.leyou.page.service;

import com.leyou.common.exception.domain.ExceptionEnum;
import com.leyou.common.exception.domain.LyException;
import com.leyou.item.client.ItemClient;
import com.leyou.item.dto.BrandDTO;
import com.leyou.item.dto.CategoryDTO;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class PageService {

    @Autowired
    private ItemClient itemClient;

    @Autowired
    private TemplateEngine templateEngine;

    @Value("${ly.static.itemDir}")
    private String itemDir;

    @Value("${ly.static.itemTemplate}")
    private String itemTemplate;

    /**
     * 获取指定Spu静态页面的数据
     * @param id
     * @return
     */
    public Map<String, Object> loadItemData(Long id) {
        //根据SpuId查询Spu的对象 注意对象中要对SpuDetail和Sku集合赋值
        SpuDTO spuDTO = itemClient.findSpuById(id);
        //根据当前Spu对象中的BrandId查询Brand对象
        BrandDTO brandDTO = itemClient.findBrandById(spuDTO.getBrandId());
        //根据当前Spu对象中的分类的三级id的集合查询三级分类对象集合
        List<CategoryDTO> categoryDTOS = itemClient.findCategorysByCids(spuDTO.getCategoryIds());
        //根据当前Spu对象中分类的第三级id查询规格组，包含规格组下的规格参数
        List<SpecGroupDTO> specGroupDTOS = itemClient.findSpecGroupAndParamByCid3(spuDTO.getCid3());

        Map<String, Object> itemDataMap = new HashMap<>();
        itemDataMap.put("categories", categoryDTOS);//商品分类的集合
        itemDataMap.put("brand", brandDTO);//品牌对象
        itemDataMap.put("spuName", spuDTO.getName());
        itemDataMap.put("subTitle", spuDTO.getSubTitle());
        itemDataMap.put("detail", spuDTO.getSpuDetail());//SpuDetail对象
        itemDataMap.put("skus", spuDTO.getSkus());//当前Spu下所有sku的集合
        itemDataMap.put("specs", specGroupDTOS);//List<SpecGroup(id:1,name:xx,params:List<SpecParam>)>
        return itemDataMap;
    }

    /**
     * 生成指定Spu的静态页面
     * @param id
     */
    public void createStaticPage(Long id){
        //加载上下文
        Map<String, Object> itemData = loadItemData(id);
        Context context = new Context();
        context.setVariables(itemData);
        //指定静态文件输出的文件夹和文件名称
        File itemFile = new File(new File(itemDir), id + ".html");

        //指定打印流
        try(PrintWriter write = new PrintWriter(itemFile)){
            //生成静态页面
            templateEngine.process(itemTemplate, context, write);
        }catch (Exception e){
            throw new LyException(ExceptionEnum.FILE_WRITER_ERROR);
        }

    }

    /**
     * 删除静态页面
     * @param id
     */
    public void deleteStaticPage(Long id) {
        //指定静态文件输出的文件夹和文件名称
        File itemFile = new File(new File(itemDir), id + ".html");
        if(itemFile.exists()){
            itemFile.delete();
        }
    }
}
